在invokeBeanFactoryPostProcessors
中注册beanDefinition
invokeBeanFactoryPostProcessors
->PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors
->invokeBeanDefinitionRegistryPostProcessors
->ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(registry)
->processConfigBeanDefinitions(registry)
->ConfigurationClassBeanDefinitionReader.loadBeanDefinitions
->ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass
->loadBeanDefinitionsFromRegistrars(configClass.getImportBeanDefinitionRegistrars())
->AspectJAutoProxyRegistrar.registerBeanDefinitions
1
2
3
4
5
6
7
8
9
10
11
12
13public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);
AnnotationAttributes enableAspectJAutoProxy =
AnnotationConfigUtils.attributesFor(importingClassMetadata, EnableAspectJAutoProxy.class);
if (enableAspectJAutoProxy.getBoolean("proxyTargetClass")) {
AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
}
if (enableAspectJAutoProxy.getBoolean("exposeProxy")) {
AopConfigUtils.forceAutoProxyCreatorToExposeProxy(registry);
}
}
其中AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary
最终调用的方法为AopConfigUtils.registerOrEscalateApcAsRequired
:
1 | private static BeanDefinition registerOrEscalateApcAsRequired(Class<?> cls, BeanDefinitionRegistry registry, Object source) { |
其中cls为AnnotationAwareAspectJAutoProxyCreator
,在registry中注册AnnotationAwareAspectJAutoProxyCreator
的beanDefinition,key为org.springframework.aop.config.internalAutoProxyCreator
bean创建及初始化
bean创建工作在DefaultListableBeanFactory.doCreateBean
中完成:
- 调用
AbstractAutowireCapableBeanFactory.createBeanInstance
创建bean实例。 - 调用
AbstractAutowireCapableBeanFactory.populateBean
填充bean实例。 - 调用
AbstractAutowireCapableBeanFactory.initializeBean
初始化bean实例
1 | protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) { |
重点关注applyBeanPostProcessorsAfterInitialization
,它调用各个beanPostProcessor的postProcessAfterInitialization
。
进入AbstractAutoProxyCreator.postProcessAfterInitialization
1 | public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { |
进入AbstractAutoProxyCreator.wrapIfNecessary
,这个方法根据bean是否需要代理来包装一层代理
1 | protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) { |
createProxy
在bean初始化过程中,如果发现bean的advice不为空,则调用AbstractAutoProxyCreator.createProxy
创建bean的代理
1 | protected Object createProxy(Class<?> beanClass, String beanName, Object[] specificInterceptors, TargetSource targetSource) { |
最后调用ProxyFactory.getProxy
方法,该方法只有一行代码:
1 | public Object getProxy(ClassLoader classLoader) { |
初始化AopProxy
初始化AopProxy调用的是ProxyCreatorSupport.createAopProxy
1 | protected final synchronized AopProxy createAopProxy() { |
首先获取aopProxyFactory,再调用DefaultAopProxyFactory
中的createAopProxy
方法。这就是生成代理的入口,你会发现传入的参数是this,其实传入的就是this(ProxyCreatorSupport)的父类AdvisedSupport
中的advisor等生成代理的核心参数。
Spring根据代理的目标对象是否实现了接口,来返回JdkDynamicAopProxy的动态代理或者CGLIB的代理,并且传入advisor核心参数。(JdkDynamicAopProxy这个实现了InvocationHandler,要实现invoke的关键就是传入的advisor)
1 | public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException { |
接着看JdkDynamicAopProxy
:
1 | public JdkDynamicAopProxy(AdvisedSupport config) throws AopConfigException { |
将传入的AdvisedSupport赋值到advised里。
获取代理对象
回到ProxyFactory.getProxy
方法,方法中先调用createAopProxy
创建AopProxy
,再调用getProxy
获取代理对象。
以JdkDynamicAopProxy
为例:
1 | public Object getProxy(ClassLoader classLoader) { |
调用Proxy.newProxyInstance
创建代理类。这是java reflect包提供的原生创建代理类的方法。就是在这里,目标对象的代理对象完成了创建并返回。
回到AbstractAutowireCapableBeanFactory.initializeBean
方法,wrappedBean在经过applyBeanPostProcessorsAfterInitialization
处理,调用AbstractAutoProxyCreator.postProcessAfterInitialization
,wrappedBean变成了一个代理类。
invoke
当调用aop代理类的方法时,调用的实际上是JdkDynamicAopProxy.invoke
:
1 | public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { |
AdvisedSupport.getInterceptorsAndDynamicInterceptionAdvice
根据给定的方法,获取一个MethodInterceptor对象的列表。
1 | public List<Object> getInterceptorsAndDynamicInterceptionAdvice(Method method, Class<?> targetClass) { |
看看DefaultAdvisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice
方法:
1 | public List<Object> getInterceptorsAndDynamicInterceptionAdvice(Advised config, Method method, Class<?> targetClass) { |
ReflectiveMethodInvocation.proceed
1 | public Object proceed() throws Throwable { |
参考: